package job

/*
 *
 删除排序链表中的重复元素(全部删除)链表中节点数目在范围 [0, 300] 内
 -100 <= Node.Val <= 100
 题目数据保证链表已经按升序排列
 [1,1,2,2,3,4] . []
 [1,1,2] . [2]
 [1,2,2,3] . [2,3]
*/

// @lc code=start
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteAllDuplicates(pHead *ListNode) *ListNode {
	if pHead == nil || pHead.Next == nil {
		return pHead
	}
	// 去除开头数字相同的元素
	ret := &ListNode{Next: pHead}
	p := ret
	q := p.Next // 指向待处理节点的父节点,指向相同元素的最后一个元素
	val := q.Val
	for p != nil && q != nil && q.Next != nil {
		if val == q.Next.Val {
			q = q.Next
			continue
		}
		if p.Next == q { // 不重复
			p = p.Next
		} else { // 删除原始
			p.Next = q.Next
		}
		q = p.Next
		val = q.Val
	}
	if p.Next != q { //处理尾部的重复元素
		p.Next = nil
	}
	return ret.Next
}

// @lc code=end
